#Redis #NoSQL #NOTE #DBMS
Redis
What is Hash?
哈希 的实质是一个算法。
- 任意长度的信息(可以是字符串、数据或者任何文件)经过哈希运算后,输出一个固定长度的值,这个值就是哈希值。
- 哈希运算是一种压缩映射,在哈希计算器中无论输入什么样的数据,最后得到的结果都是一个固定长度的数字/字母混合的随机数列
Common Hash Algorithm
- MD5
- SHA-1
- SHA-256
Hash Application
[!abstract]+ Hash application
- Digest(摘要),Checksum(校验值),Fingerprint(指纹)
- 文件校验
- 文件传输校验:MD5
- 保存二进制文件系统数字指纹:MD5
- 数字签名
- 鉴权协议
- 网站注册
- 区块链和加密货币:SHA-256和RIPEMD160
Key-Value Store
+ What is Key - Value store?
键值存储是一个简单的哈希表 所有对数据库的访问都是通过主键 通过键值存储可以
- 获取键值
- 输入键值
- 从数据存储中删除一个键值
Features
[!abstract]+ Key-Value store feature
- 哈希函使键值数据访问可实现高性能和高可用性
- 键和值都可以是复杂的复合对象,有时也可以是列表、地图或其他数据结构。
- 一致性只适用于对单个键的操作(最终一致性)
- 将所有数据存储在单个数据桶中
Pros and Cons
优点
- 高效查询(性能非常可预测)。
- 易于在集群中分配。
- 面向服务不允许使用外键约束,无论如何都要在代码中完成连接。
- 使用关系数据库 + 高速缓存,无论如何都要使用键值存储
- 无对象-关系错配缺点
缺点
- 没有复杂的查询过滤器
- 所有连接必须在代码中完成
- 无外键约束
- 无触发器
What is Redis?
REmote DIctionary Server(Redis)是一个开源的内存 NoSQL 数据库项目,它实现了一个分布式、内存键值存储,并具有可选的耐用性
该项目主要由 Salvatore Sanfilippo
开发,目前由 Redis Labs 赞助
Feature
- 读写速度极快
- 持久、可扩展
- 直接数据访问
Application Scenario
- 存储会话信息
- 用户配置文件、首选项
- 购物车数据
Unsuitable Scenario
- 数据之间的关系
- 多操作事务
- 按数据查询
- 按集合操作
Quick Start Only For MacOS
Installation
- 安装 Redis (此处采用
homebrew
包管理器进行安装)
brew install redis
Start
- MacOS 后台启动 Redis
brew services start redis
- 命令行启动 Redis
redis-cli
Close
exit
brew services stop redis
Redis Operation
Operation On Database
- 选择数据库
Select <index>
[!example]+
- 查看数据库
Config get databases
[!example]+
- 删除数据库
[!example]+ 删除单个数据库
shellFLUSHDB
[!example]+ 删除所有数据库
shellFLUSHALL
Operation On Key
- Set 将值存储到key对应的内存空间中
Set <key> <value>
- Get 读取key对应的数据
Get <key>
- Del 如果Key存在, 则删除该Key
Del <key>
- Exists 判断key是否存在
Exists <key>
- Expire 在指定时间(以秒为单位)后使密钥失效。
Expire <key> <seconds>
- Move 将当前数据库的key移动到指定的数据库
Move <key> <db>
- Rename 重命名key
Rename <key> <newkey>
- Type 返回key的数据类型
Type <key>
Redis Data structure
- String
- List
- Hash
- Set
- ZSet
- Stream
String
- 得到从 start 到 end 的字符串
getrange <key> <start> <end>
- 设置key的值,并返回旧值
getset <key> <value>
- 得到多个key的值
mget <key1> <key2> <key3>
- 设置多个key的值
setrange <key> <offset> <value>
- 得到字符串的长度
strlen <key>
- 覆盖从指定位置开始的键字符串部分
setrange <key> <offset> <value>
- Key +1/-1
incr/decr <key>
- Key (+value/-value)
incrby/decrby <key> <value>
- Append value to key
append <key> <value>
- SetBit:用于设置键值字符串中指定位置的值。
setbit <key> <place> <val>
- GetBit:用于获取键值字符串中指定位置的值。
getbit <key> <place> <val>
- BitCount:用于统计键值字符串中二进制位为 1 的数量。
bitcount <key>
Hash
- HSET:用于设置哈希字段的值。
hset <key> <field> <value>
- HMSET: 用于设置多个哈希字段的值。
hmset <key> <field1> <value1> <field2> <value2>
- HGET:用于获取哈希字段的值。
hget <key> <field>
- HMGET: 获取所有给定哈希字段的值。
hmget <key> <field1> <field2>
- HGETALL:获取哈希中指定键的所有字段和值。
hgetall <key>
- HDEL:删除哈希中的一个或多个字段。
HDEL <key> <field1> <field2>
- HEXISTS:查看哈希中是否存在指定字段。
HEXISTS <key> <field>
- HLEN: 获取哈希中字段的数量。
HLEN <key>
- HKEYS:获取哈希中的所有字段。
HKEYS <key>
- HVALS:获取哈希中的所有值。
HVALS <key>
- HINCRBY:用于增加哈希中指定字段的值。
HINCRBY <key> <field> <value>
- HINCRBYFLOAT:用于按给定值递增哈希字段的浮点值。
HINCRBYFLOAT <key> <field> <value>
List
- LPUSH:将一个或多个值插入到列表的头部。
LPUSH <key> <value1> <value2>
- RPUSH: 将一个或多个值插入到列表的尾部。
RPUSH <key> <value1> <value2>
- LPOP:移除并返回列表的第一个元素。
LPOP <key>
- RPOP:移除并返回列表的最后一个元素。
RPOP <key>
- LRANGE:获取列表指定范围内的元素。
LRANGE <key> <start> <end>
- LINDEX:通过索引获取列表中的元素。
LINDEX <key> <index>
- LLEN:获取列表的长度。
LLEN <key>
- LTRIM:将列表修剪到指定范围(start end )。
LTRIM <key> <start> <end>
- LREM: 从键值存储的列表中删除第一个出现的元素值。该操作受 count 影响:
- 如果 count >0,则移除与从头部移至尾部的值相同的元素的第一个出现次数。
- 如果 count <0,则删除从尾部移动到头部的值相等的元素的第一个出现次数。
- 如果 count = 0,则删除所有等于值的元素。
LREM <key> <count> <value>
- LINSERT:在列表的元素前或后插入元素。
LINSERT <key> <before/after> <pivot> <value>
- LSET:通过索引设置列表元素的值。
LSET <key> <index> <value>
- RPOPLPUSH::移除列表的最后一个元素,并将该元素添加到另一个列表并返回。
RPOPLPUSH <source> <destination>
Set
Redis 集合是无序集合 添加、删除和测试成员是否存在的时间为 O(1) Redis 集合具有不允许重复成员的理想特性。多次添加相同元素将导致集合中只有该元素的一个副本。
- SADD
- Set Add 为集合添加一个或多个成员。
SADD <key> <Member1> <Member2>
- SMEMBERS: 显示集合的所有成员。
SMEMBERS <key>
- SCARD: 返回集合中成员的数量。
SCARD <key>
- SREM: 删除集合中的一个或多个成员
- Set Remove
SREM <key> <Member1> <Member2>
- SISMEMBER: 检查给定值是否是集合的成员。如果值是成员,则返回 1,否则返回 0。
- Set IsMember
SISMEMBER <key> <Member>
- SPOP: 根据计数从集合中删除并返回一个或多个随机成员。
- Set Pop
SPOP <key> <num>
- SRANDMEMBER: 根据计数从集合中获取一个或多个随机成员
- Set Random Member
SRANDMEMBER <key> <num>
- SMOVE: 将成员从一个集合移动到另一个集合。
- Set Move Move from one set to another set
SMOVE <source> <destination> <member>
- SUNION: 返回多个集合的并集。
- Set Union
SUNION <set1> <set2>
- SINTER: 返回多个集合的交集。
- Set Intersection
SINTER <set1> <set2>
- SDIFF: 返回多个集合的差值
- Set Difference
SDIFF <set1> <set2>
- SUNIONSTORE: 将多个集合的交集存储在一个键中
- Set Union Store
SUNIONSTORE <newkey> <set1> <set2>
- SINTESTORE: 将多个集合的交集存储在一个键中
- Set Intersection Store
SINTESTORE <newkey> <set1> <set2>
- SDIFFSTORE:
- Set Difference Store
SDIFFSTORE <newkey> <set1> <set2>
ZSet
Redis 排序集是字符串的非重复集合,与 Redis 集类似。 其中,排序集的每个成员都与一个分数相关联,该分数用于将排序集从小到大排序。 虽然分数可以重复,但成员和集合一样是唯一的。
对排序集进行添加、删除或更新等操作的速度非常快(执行时间与元素数量的对数成正比)。 由于元素是按顺序提取的,而不是事后排序,因此还可以通过得分或排名(位置)快速获取范围。 总之,使用排序集,可以以极佳的性能完成许多任务,而这些任务在其他类型的数据库中很难实现。
- ZADD: 向排序集添加一个或多个成员,或更新其分数(如果存在)。
- ZSet Add
ZADD <key> <score1> <member1> <score2> <member2>
- ZRANGE: 按索引返回排序集合中成员的范围。升序
- ZSet Range
ZRANGE key start stop [WITHSCORES]
- ZREVRANGE: 按索引返回排序集合中成员的范围。降序
- ZSet Reverse Range
ZREVRANGE key start stop [WITHSCORES]
- ZSCORE: 获取排序集合中给定成员的相关分数
- ZSet Score
ZSCORE <key> <member>
- ZRANGEBYSCORE: 返回排序集中成员的范围,其分数介于最小值和最大值之间,升序
- ZSet Range by Score
ZRANGEBYSCORE <key> <min> <max> [WITHSCORES] [LIMIT count]
- ZREVRANGEBYSCORE: 返回排序集中成员的范围,其分数介于最小值和最大值之间,降序
ZREVRANGEBYSCORE <key> <max> <min> [WITHSCORES] [LIMIT count]
- ZCARD: 获取排序集合中的成员数。
- ZSet Cardinality
ZCARD <key>
- ZCOUNT: 获取排序集合中分数介于最小值和最大值之间的成员个数。
- ZSet Count
ZCOUNT <key> min max
- ZRANK: 返回排序集合中某个成员的索引
- ZSet Rank
ZRANK <key> <Member>
- ZREVRANK:返回排序集合中某个成员的索引, 降序
- ZSet Reverse Rank
ZREVRANK <key> <Member>
- ZREM: 删除集合中的一个或多个成员
- ZSet Remove
ZREM <key> <Member1> <Member2>
- ZREMRANGEBYSCORE: 删除排序集合中分数介于最小值和最大值之间的成员。
- ZSet Remove Range by Score
ZREMRANGEBYSCORE <key> <min> <max>
- ZREMRANGEBYRANK: 删除排序集合中给定索引范围内的所有成员。
- ZSet Remove Range by Rank
ZREMRANGEBYRANK <key> <start> <stop>
- ZINCRBY: 增加排序集合中成员的得分。
- ZSet Increment by Score
ZINCRBY <key> <score>
- ZINTESTORE: 计算两个或多个排序集的交集,并将其存储到目的地。
- ZSet Intersection Store
ZINTERSTORE <newkey> <set count> <set1> <set2> WEIGHTS [weight1][weight2] [aggregate sum|min|max]
- ZUNIONSTORE: 计算两个或多个排序集的并集,并将其存储到目的地。
- ZSet Union Store
ZUNIONSTORE <newkey> <set count> <set1> <set2> WEIGHTS [weight1][weight2] [aggregate sum|min|max]
Publish and Subscribe
Redis 实现了发布/订阅(Publish/Subscribe)消息传递范式,在这种范式中,发送者(发布者)不需要向特定的接收者(订阅者)发送消息。
相反,发布的消息被归类到频道中,而不知道有哪些订阅者。
订阅者对一个或多个频道表示兴趣,只接收感兴趣的信息,而不知道有哪些发布者。
这样可以实现更高的可扩展性和更动态的网络拓扑结构。
一旦进入订阅模式,Redis-cli 将不接受任何命令,除非使用 Ctrl+C 退出该模式。
Subscribe
- SUBSCRIBE: 监听发布到指定频道的信息。
SUBSCRIBE [Chanel1] [Chanel2] [Chanel3]
- PSUBSCRIBE : 订阅与给定模式匹配的频道。
PSUBSCRIBE pattern1 [pattern2]
- 例如:订阅所有 带News 的频道。
PSUBSCRIBE *News
- UNSUBSCRIBE: 从指定频道取消订阅客户端,如果没有指定频道,则从所有频道取消订阅。
UNSUBSCRIBE [Chanel1] [Chanel2] [Chanel3]
- PUNSUBSCRIBE:从符合给定模式的频道中取消订阅客户端。
PUNSUBSCRIBE pattern1 [pattern2] (取消订阅模式)
- 在 Redis 中,当客户端在命令行下工作时,处于订阅状态的客户端不接受任何命令,因此按下 Ctrl-C 时会自动取消订阅所有通道。
Publish
向频道发布消息。
PUBLISH <channel> <message>
Transactions in Redis
Redis 事务允许在一个步骤中执行一组命令。 事务中的所有命令都被序列化并按顺序执行。 在执行 Redis 事务的过程中,绝不会出现其他客户端发出的请求被送达的情况。 这就保证了命令是作为一个单独的操作执行的。
要么处理所有命令,要么不处理任何命令,因此 Redis 事务也是原子性的。 EXEC 命令会触发事务中所有命令的执行。 如果客户端在调用 MULTI 命令之前,在事务上下文中失去了与服务器的连接,则不会执行任何操作。相反,如果调用 EXEC 命令,则会执行所有操作。
MULTI: 标记一个事务块的开始。
MULTI
SET Name Mark
SET Age 25
INCRBY Age 5
GET *
EXEC: 执行所有事务块内的命令。
EXEC
Redis Configuration
Redis.conf 是 Redis 配置文件,可用于配置 Redis 的各个方面。
Redis 的每个版本都有一个文档详尽的 redis.conf 文件。
示例文件包含默认配置选项,有助于了解这些设置的作用和默认值。
config set 命令可用于设置配置文件中的各个值。
config set CONFIG_SETTING_NAME
- config get 命令用于显示某个设置的值。
config get CONFIG_SETTING_NAME
- 可以使用以下命令查看 Redis.conf 中的所有可用设置:
config get *